#!/usr/bin/env bash
# 验收测试脚本
# 用于验证项目的各项功能是否正常工作

set -euo pipefail

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查依赖
check_dependencies() {
    log_info "检查依赖..."

    # 检查 Python
    if ! command -v python &> /dev/null; then
        log_error "Python 未安装"
        exit 1
    fi

    # 检查 ffmpeg
    if ! command -v ffmpeg &> /dev/null; then
        log_warn "ffmpeg 未安装，部分功能可能不可用"
    fi

    log_info "依赖检查完成"
}

# 清理函数
cleanup() {
    log_info "清理临时文件..."
    # 注意：保留 outputs 目录，因为可能包含有用的输出
}

# 验证输出文件
verify_output() {
    local output_file=$1
    local test_name=$2

    if [ -f "$output_file" ]; then
        local size=$(stat -f%z "$output_file" 2>/dev/null || stat -c%s "$output_file" 2>/dev/null || echo 0)
        if [ "$size" -gt 0 ]; then
            log_info "$test_name 通过: $output_file (${size} bytes)"
            return 0
        else
            log_error "$test_name 失败: $output_file 为空文件"
            return 1
        fi
    else
        log_error "$test_name 失败: $output_file 不存在"
        return 1
    fi
}

# 测试 1: JSON 场景输入
test_json_scenes() {
    log_info "测试 1: 从 JSON 场景文件生成视频"
    rm -rf outputs/test1
    mkdir -p outputs/test1

    python markdown_to_video.py examples/scence_text.json \
        --outdir outputs/test1 \
        --overwrite \
        --embed-subtitles \
        --no-manim 2>&1 | tee outputs/test1.log

    verify_output "outputs/test1/final.mp4" "JSON 场景测试"
}

# 测试 2: Markdown 直出片
test_markdown_direct() {
    log_info "测试 2: 从 Markdown 直接生成视频（无 Manim）"
    rm -rf outputs/test2
    mkdir -p outputs/test2

    python markdown_to_video.py examples/example.md \
        --no-manim \
        --outdir outputs/test2 \
        --overwrite \
        --embed-subtitles 2>&1 | tee outputs/test2.log

    verify_output "outputs/test2/final.mp4" "Markdown 直出片测试"
    verify_output "outputs/test2/scenes.json" "场景 JSON 导出测试"
}

# 测试 3: Schema 验证
test_schema_validation() {
    log_info "测试 3: 场景 Schema 验证"
    rm -rf outputs/test3
    mkdir -p outputs/test3

    # 复制场景文件
    cp examples/scence_text.json outputs/test3/scenes.json

    # 验证 Schema
    if python -c "from schemas.scenes_schema import validate_scenes_file; validate_scenes_file('outputs/test3/scenes.json')" 2>/dev/null; then
        log_info "Schema 验证测试通过"
    else
        log_warn "Schema 验证测试跳过（模块不可用）"
    fi
}

# 测试 4: 缓存功能
test_cache() {
    log_info "测试 4: 缓存功能"
    rm -rf outputs/test4
    mkdir -p outputs/test4

    # 第一次运行（填充缓存）
    log_info "第一次运行（填充缓存）..."
    python markdown_to_video.py examples/example.md \
        --no-manim \
        --outdir outputs/test4 \
        --overwrite \
        --cache \
        --embed-subtitles 2>&1 | tee outputs/test4_run1.log

    verify_output "outputs/test4/final.mp4" "缓存测试（第一次运行）"

    # 第二次运行（使用缓存）
    log_info "第二次运行（使用缓存）..."
    python markdown_to_video.py examples/example.md \
        --no-manim \
        --outdir outputs/test4 \
        --cache \
        --embed-subtitles 2>&1 | tee outputs/test4_run2.log

    verify_output "outputs/test4/final.mp4" "缓存测试（第二次运行）"

    # 清除缓存
    log_info "清除缓存..."
    python markdown_to_video.py examples/example.md \
        --no-manim \
        --outdir outputs/test4 \
        --clear-cache 2>&1 | tee outputs/test4_clear.log
}

# 测试 5: LLM 场景生成（可选）
test_llm_scenes() {
    if [ -n "${DEEPSEEK_API_KEY:-}" ]; then
        log_info "测试 5: 使用 DeepSeek 生成场景"
        rm -rf outputs/test5
        mkdir -p outputs/test5

        python markdown_to_video.py examples/example.md \
            --use-llm-scenes \
            --provider deepseek \
            --model deepseek-chat \
            --no-manim \
            --outdir outputs/test5 \
            --overwrite \
            --embed-subtitles 2>&1 | tee outputs/test5.log

        verify_output "outputs/test5/final.mp4" "LLM 场景生成测试"
        verify_output "outputs/test5/scenes.json" "LLM 场景 JSON 测试"
    else
        log_warn "测试 5 跳过: 未设置 DEEPSEEK_API_KEY"
    fi
}

# 测试 6: 字幕对齐
test_subtitle_alignment() {
    log_info "测试 6: 字幕对齐"
    rm -rf outputs/test6
    mkdir -p outputs/test6

    python markdown_to_video.py examples/example.md \
        --no-manim \
        --outdir outputs/test6 \
        --overwrite \
        --align-subs \
        --embed-subtitles 2>&1 | tee outputs/test6.log

    verify_output "outputs/test6/captions.srt" "字幕文件生成测试"
    if [ -f "outputs/test6/captions_aligned.srt" ]; then
        log_info "字幕对齐测试通过"
    fi
}

# 测试 7: 主题切换
test_themes() {
    log_info "测试 7: 主题切换"
    for theme in dark light; do
        rm -rf "outputs/test7_${theme}"
        mkdir -p "outputs/test7_${theme}"

        python markdown_to_video.py examples/example.md \
            --no-manim \
            --theme "$theme" \
            --outdir "outputs/test7_${theme}" \
            --overwrite \
            --embed-subtitles 2>&1 | tee "outputs/test7_${theme}.log"

        verify_output "outputs/test7_${theme}/final.mp4" "主题测试 ($theme)"
    done
}

# 测试 8: 分辨率和帧率
test_resolution_fps() {
    log_info "测试 8: 分辨率和帧率参数"
    rm -rf outputs/test8
    mkdir -p outputs/test8

    python markdown_to_video.py examples/example.md \
        --no-manim \
        --resolution 1920x1080 \
        --fps 30 \
        --outdir outputs/test8 \
        --overwrite \
        --embed-subtitles 2>&1 | tee outputs/test8.log

    verify_output "outputs/test8/final.mp4" "分辨率/帧率测试"
}

# 生成测试报告
generate_report() {
    log_info "生成测试报告..."
    cat > outputs/test_report.md << 'EOF'
# 验收测试报告

## 测试概览

| 测试项 | 状态 | 说明 |
|--------|------|------|
EOF

    for i in {1..8}; do
        if [ -f "outputs/test${i}/final.mp4" ] || [ -f "outputs/test${i}.log" ]; then
            echo "| 测试 $i | ✓ 通过 | 详见 outputs/test${i}/ |" >> outputs/test_report.md
        else
            echo "| 测试 $i | ✗ 失败 | 详见 outputs/test${i}.log |" >> outputs/test_report.md
        fi
    done

    cat >> outputs/test_report.md << 'EOF'

## 环境信息

- Python 版本: $(python --version)
- ffmpeg 版本: $(ffmpeg -version 2>/dev/null | head -1 || echo "未安装")
- 测试时间: $(date)

## 注意事项

- 如果某些测试失败，请检查对应目录下的 .log 文件
- LLM 相关测试需要设置相应的 API Key
- 缓存测试验证了断点续跑功能是否正常
EOF

    log_info "测试报告已生成: outputs/test_report.md"
}

# 主函数
main() {
    log_info "开始验收测试"
    log_info "测试时间: $(date)"
    log_info "===================="

    # 切换到项目根目录
    cd "$(dirname "$0")/.."

    # 设置清理陷阱
    trap cleanup EXIT

    # 检查依赖
    check_dependencies

    # 创建输出目录
    mkdir -p outputs

    # 运行测试
    test_json_scenes || true
    test_markdown_direct || true
    test_schema_validation || true
    test_cache || true
    test_llm_scenes || true
    test_subtitle_alignment || true
    test_themes || true
    test_resolution_fps || true

    # 生成报告
    generate_report

    log_info "===================="
    log_info "验收测试完成"
    log_info "详细报告: outputs/test_report.md"
}

# 运行主函数
main "$@"
